var TINY = TINY || {},
T$ = T$ || function(i) {
    return document.getElementById(i)
},
T$$$ = T$$$ || function() {
    return document.all?1 : 0
};

TINY.editor = function() {
    var c = [], offset = -30;
    c['bold'] = [4, 'Bold', 'a', 'bold'];
    c['italic'] = [5, 'Italic', 'a', 'italic'];
    c['underline'] = [6, 'Underline', 'a', 'underline'];
    c['strikethrough'] = [7, 'Strikethrough', 'a', 'strikethrough'];
    c['subscript'] = [8, 'Subscript', 'a', 'subscript'];
    c['superscript'] = [9, 'Superscript', 'a', 'superscript'];
    c['orderedlist'] = [10, 'Insert Ordered List', 'a', 'insertorderedlist'];
    c['unorderedlist'] = [11, 'Insert Unordered List', 'a', 'insertunorderedlist'];
    c['outdent'] = [12, 'Outdent', 'a', 'outdent'];
    c['indent'] = [13, 'Indent', 'a', 'indent'];
    c['leftalign'] = [14, 'Left Align', 'a', 'justifyleft'];
    c['centeralign'] = [15, 'Center Align', 'a', 'justifycenter'];
    c['rightalign'] = [16, 'Right Align', 'a', 'justifyright'];
    c['blockjustify'] = [17, 'Block Justify', 'a', 'justifyfull'];
    c['undo'] = [18, 'Undo', 'a', 'undo'];
    c['redo'] = [19, 'Redo', 'a', 'redo'];
    c['image'] = [20, 'Insert Image', 'i', 'insertimage', 'Enter Image URL:', 'http://'];
    c['hr'] = [21, 'Insert Horizontal Rule', 'a', 'inserthorizontalrule'];
    c['link'] = [22, 'Insert Hyperlink', 'i', 'createlink', 'Enter URL:', 'http://'];
    c['unlink'] = [23, 'Remove Hyperlink', 'a', 'unlink'];
    c['unformat'] = [24, 'Remove Formatting', 'a', 'removeformat'];
    c['print'] = [25, 'Print', 'a', 'print'];
    c['clear_p'] = [26, 'Clear Unnecessary Tags', 'a', 'clear_p'];
    c['nbsp'] = [29, 'Insert Hard Space', 'a', 'nbsp'];
    function edit(n, obj) {
        this.n = n;
        window[n] = this;
        this.t = T$(obj.id);
        this.obj = obj;
        this.xhtml = obj.xhtml;
        var p = document.createElement('div'), w = document.createElement('div'), h = document.createElement('div'),
        l = obj.controls.length, i = 0;
        this.i = document.createElement('iframe');
        this.i.width = obj.width || '500';
        this.i.height = obj.height || '250';
        this.ie = T$$$();
        h.className = obj.rowclass || 'tinyeditor-header';
        p.className = obj.cssclass || 'tinyeditor';
        p.style.width = this.i.width + 'px';
        p.appendChild(h);
        for(i; i < l; i++) {
            var id = obj.controls[i];
            if(id == 'n') {
                h = document.createElement('div');
                h.className = obj.rowclass || 'tinyeditor-header';
                p.appendChild(h);
            } else if(id == '|') {
                var d = document.createElement('div');
                d.className = obj.dividerclass || 'tinyeditor-divider';
                h.appendChild(d);
            } else if(id == 'font') {
                var sel = document.createElement('select'), fonts = obj.fonts || ['Verdana', 'Arial', 'Georgia'], fl = fonts.length, x = 0;
                sel.className = 'tinyeditor-font';
                sel.onchange = new Function(this.n + '.ddaction(this, "fontname")');
                sel.options[0] = new Option('Font', '');
                for(x; x < fl; x++) {
                    var font = fonts[x];
                    sel.options[x + 1] = new Option(font, font);
                }
                h.appendChild(sel)
            } else if(id == 'size') {
                var sel = document.createElement('select'), sizes = obj.sizes || [1, 2, 3, 4, 5, 6, 7], sl = sizes.length, x = 0;
                sel.className = 'tinyeditor-size';
                sel.onchange = new Function(this.n + '.ddaction(this, "fontsize")');
                for(x; x < sl; x++) {
                    var size = sizes[x];
                    sel.options[x] = new Option(size, size);
                }
                h.appendChild(sel)
            } else if(id == 'style') {
                var sel = document.createElement('select'),
                styles = obj.styles || [['Style', ''], ['Paragraph', '<p>'], ['Header 1', '<h1>'], ['Header 2', '<h2>'], ['Header 3', '<h3>'], ['Header 4', '<h4>'], ['Header 5', '<h5>'], ['Header 6', '<h6>']],
                sl = styles.length, x = 0;
                sel.className = 'tinyeditor-style';
                sel.onchange = new Function(this.n + '.ddaction(this, "formatblock")');
                for(x; x < sl; x++) {
                    var style = styles[x];
                    sel.options[x] = new Option(style[0], style[1]);
                }
                h.appendChild(sel);
            } else if(c[id]) {
                var div = document.createElement('div'), x = c[id], func = x[2], ex, pos = x[0] * offset;
                div.className = obj.controlclass;
                div.unselectable = 'on';
                div.style.backgroundPosition = '0px ' + pos + 'px';
                div.title = x[1];
                ex = func == 'a'?'.action("' + x[3] + '", 0, ' + (x[4] || 0) + ')' : '.insert("' + x[4] + '", "' + x[5] + '", "' + x[3] + '")';
                switch (id){
                    case 'print':
                        div.onmousedown = new Function(this.n + '.print()');
                        break;
                    case 'clear_p':
                        div.onmousedown = new Function(this.n + '.clear_p()');
                        break;
                    case 'nbsp':
                        div.onmousedown = new Function(this.n + '.nbsp()');
                        break;
                    default:
                        div.onmousedown = new Function(this.n + ex);
                }
                
                div.onmouseover = new Function(this.n + '.hover(this, ' + pos + ', 1)');
                div.onmouseout = new Function(this.n + '.hover(this, ' + pos + ', 0)');
                h.appendChild(div);
                if(this.ie) {
                    div.unselectable = 'on'
                }
            }
        }
        this.t.parentNode.insertBefore(p, this.t);
        this.t.style.width = this.i.width + 'px';
        w.appendChild(this.t);
        w.appendChild(this.i);
        p.appendChild(w);
        this.t.style.display = 'none';
        if(obj.footer) {
            var f = document.createElement('div');
            f.className = obj.footerclass || 'tinyeditor-footer';
            if(obj.toggle) {
                var to = obj.toggle, ts = document.createElement('div');
                ts.id = n + "ToggleDiv";
                ts.className = to.cssclass || 'toggle';
                ts.innerHTML = obj.toggletext || 'source';
                ts.onclick = new Function(this.n + '.toggle(0, this);return false');
                f.appendChild(ts);
            }
            if(obj.resize) {
                var ro = obj.resize, rs = document.createElement('div');
                rs.className = ro.cssclass || 'resize';
                rs.onmousedown = new Function('event', this.n + '.resize(event);return false');
                rs.onselectstart = function() {
                    return false
                };
                f.appendChild(rs);
            }
            p.appendChild(f);
        }
        this.e = this.i.contentWindow.document;
        this.e.open();
        var m = '<html><head>', bodyid = obj.bodyid?" id=\"" + obj.bodyid + "\"" : "";
        if(obj.cssfile) {
            m += '<link rel="stylesheet" href="' + obj.cssfile + '" />'
        }
        if(obj.css) {
            m += '<style type="text/css">' + obj.css + '</style>'
        }
        m += '</head><body' + bodyid + ' contenteditable="true">' + (obj.content || this.t.value);
        m += '</body></html>';
        this.e.write(m);
        this.e.close();
        this.e.designMode = 'On';
        this.d = 1;
        if(this.xhtml) {
            try{
                this.e.execCommand("styleWithCSS", 0, 0)
            }
            catch(e) {
                try{
                    this.e.execCommand("useCSS", 0, 1)
                }catch(e) {}
            }
        }
    };
    edit.prototype.clear_p = function(){
        if(this.d) {
            this.toggle(0);
            this.toggle(1);
        }
    }
    edit.prototype.nbsp = function(){
        this.restoreSelection();
        var area=this.t;

        // Mozilla and other NORMAL browsers
        if ((area.selectionStart)||(area.selectionStart=='0')){
            var p_start=area.selectionStart;
            var p_end=area.selectionEnd;
            area.value=area.value.substring(0,p_start)+'&nbsp;'+area.value.substring(p_end,area.value.length);
        }

        // Internet Explorer
        if (document.selection){
            area.focus();
            sel=document.selection.createRange();
            sel.text='&nbsp;';
        }
    }
    edit.prototype.print = function() {
        this.i.contentWindow.print();
    };
    edit.prototype.hover = function(div, pos, dir) {
        this.getSelection();
        div.style.backgroundPosition = (dir ? '34px ' : '0px ') + (pos) + 'px';
    };
    edit.prototype.getSelection = function() {
        if(this.ie && this.e.getSelection) {
            this.sel = this.e.getSelection();
            if(this.sel.getRangeAt && this.sel.rangeCount) {
                this.range = this.sel.getRangeAt(0);
            }
        }
    };
    edit.prototype.restoreSelection = function() {
        if (this.range && this.ie) {
            if (this.e.getSelection) {
                this.sel = this.e.getSelection();
                this.sel.removeAllRanges();
                this.sel.addRange(this.range);
            }
        }
    };
    edit.prototype.ddaction = function(dd, a) {
        var i = dd.selectedIndex, v = dd.options[i].value;
        this.action(a, v);
    };
    edit.prototype.action = function(cmd, val, ie) {
        if(ie && !this.ie) {
            alert('Your browser does not support this function.')
        } else{
            this.restoreSelection();
            this.e.execCommand(cmd, 0, val || null);
        }
    };
    edit.prototype.insert = function(pro, msg, cmd) {
        var val = prompt(pro, msg);
        if(val!= null && val!= '') {
            this.e.execCommand(cmd, 0, val)
        }
    };
    edit.prototype.setfont = function() {
        this.restoreSelection();
        execCommand('formatblock', 0, hType);
    };
    edit.prototype.resize = function(e) {
        if(this.mv) {
            this.freeze()
        }
        this.i.bcs = TINY.cursor.top(e);
        this.mv = new Function('event', this.n + '.move(event)');
        this.sr = new Function(this.n + '.freeze()');
        if(this.ie) {
            document.attachEvent('onmousemove', this.mv);
            document.attachEvent('onmouseup', this.sr);
        } else{
            document.addEventListener('mousemove', this.mv, 1);
            document.addEventListener('mouseup', this.sr, 1);
        }
    };
    edit.prototype.move = function(e) {
        var pos = TINY.cursor.top(e);
        this.i.height = parseInt(this.i.height) + pos-this.i.bcs;
        this.i.bcs = pos;
    };
    edit.prototype.freeze = function() {
        if(this.ie) {
            document.detachEvent('onmousemove', this.mv);
            document.detachEvent('onmouseup', this.sr);
        } else{
            document.removeEventListener('mousemove', this.mv, 1);
            document.removeEventListener('mouseup', this.sr, 1);
        }
    };
    edit.prototype.toggle = function(post, div) {
        var v;
        if(!this.d) {
            v = this.t.value;
            if(div) {
                div.innerHTML = this.obj.toggletext || 'source'
            }
            if(this.xhtml && !this.ie) {
                v = v.replace(/<strong>(.*)<\/strong>/gi, '<span style="font-weight:bold;">$1</span>');
                v = v.replace(/<em>(.*)<\/em>/gi, '<span style="font-weight:italic;">$1</span>');
                v = v.replace(/&nbsp;/gi, ' ');
                v = v.replace(/<p\b[^>]*>(.*?)<\/p[^>]*>/gi, '$1<br />');
            }
            this.e.body.innerHTML = v;
            this.t.style.display = 'none';
            this.i.style.display = 'block';
            this.d = 1;
        } else{
            v = this.e.body.innerHTML;
            if(this.xhtml) {
                v = v.replace(/<span class="apple-style-span">(.*)<\/span>/gi, '$1');
                v = v.replace(/ class="apple-style-span"/gi, '');
                v = v.replace(/<span style="">/gi, '');
                v = v.replace(/<br>/gi, '<br />');
                v = v.replace(/<br ?\/?>$/gi, '');
                v = v.replace(/^<br ?\/?>/gi, '');
                v = v.replace(/(<img [^>]+[^\/])>/gi, '$1 />');
                v = v.replace(/<b\b[^>]*>(.*?)<\/b[^>]*>/gi, '<strong>$1</strong>');
                v = v.replace(/<i\b[^>]*>(.*?)<\/i[^>]*>/gi, '<em>$1</em>');
                v = v.replace(/<u\b[^>]*>(.*?)<\/u[^>]*>/gi, '<span style="text-decoration:underline">$1</span>');
                v = v.replace(/<(b|strong|em|i|u) style="font-weight:normal;?">(.*)<\/(b|strong|em|i|u)>/gi, '$2');
                v = v.replace(/<(b|strong|em|i|u) style="(.*)">(.*)<\/(b|strong|em|i|u)>/gi, '<span style="$2"><$4>$3</$4></span>');
                v = v.replace(/<span style="font-weight:normal;?">(.*)<\/span>/gi, '$1');
                v = v.replace(/<span style="font-weight:bold;?">(.*)<\/span>/gi, '<strong>$1</strong>');
                v = v.replace(/<span style="font-style:italic;?">(.*)<\/span>/gi, '<em>$1</em>');
                v = v.replace(/<span style="font-weight:bold;?">(.*)<\/span>|<b\b[^>]*>(.*?)<\/b[^>]*>/gi, '<strong>$1</strong>');
                v = v.replace(/&nbsp;/gi, ' ');
                v = v.replace(/<p\b[^>]*>(.*?)<\/p[^>]*>/gi, '$1<br />');
            }
            if(div) {
                div.innerHTML = this.obj.toggletext || 'wysiwyg'
            }
            this.t.value = v;
            if(!post) {
                this.t.style.height = this.i.height + 'px';
                this.i.style.display = 'none';
                this.t.style.display = 'block';
                this.d = 0;
            }
        }
    };
    edit.prototype.setContent = function(text){
        try {
            this.e.body.innerHTML = text;
        } catch (e){
            
        }
        this.t.value = text;
        
    };
    edit.prototype.getContent = function(){
        return this.e.body.innerHTML;
        
    };
    edit.prototype.post = function() {
        if(this.d) {
            this.toggle(1);
        }
    };
    return {
        edit : edit
    }
}();

TINY.cursor = function() {
    return {
        top : function(e) {
            return T$$$()?window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop : e.clientY + window.scrollY;
        }
    }
}();